home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / lboss03p.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  12KB  |  421 lines

  1. /* 3面ボスパーツ (03p = 03 parts) */
  2. /* ボスに付いている4つのパーツ */
  3. #include <xsp2lib.h>
  4.  
  5. #include "../otoko.h"
  6. #include "../player.h"
  7. #include "../enemy.h"
  8. #include "../eshot.h"
  9. #include "../effect.h"
  10. #include "../priority.h"
  11. #include "../sound.h"
  12. #include "../psearch.h"
  13.  
  14.  
  15. /* 3面ボスとして登場時 */
  16. #define HP_0    1200    /* 左上のパーツの耐久力 */
  17. #define HP_1    180        /* 右上の   〃    */
  18. #define HP_2    1100        /* 右下の   〃    */
  19. #define HP_3    150        /* 左下の   〃    */
  20.  
  21. /* 4面ボスラッシュ時 */
  22. #define HP_4    1200    /* 左上のパーツの耐久力 */
  23. #define HP_5    900        /* 右上の   〃    */
  24. #define HP_6    1100    /* 右下の   〃    */
  25. #define HP_7    1000    /* 左下の   〃    */
  26.  
  27. #define TIMER_TIMEOUT    6000    /* これ以上時間が経過したら自爆 */
  28.  
  29. #define SPEED_SHOT1    8    /* 1段階目扇状弾の速度 */
  30. #define SPEED_SHOT2    12    /* 1段階目扇状弾の速度 */
  31.  
  32. #define SPEED_SHOT1_1    14    /* かま状弾の速度 */
  33. #define SPEED_SHOT1_2    16    /* 直線弾の速度 */
  34.  
  35. #define SPEED_SHOT2_1    10    /* 円形弾の遅い弾の速度 */
  36. #define SPEED_SHOT2_2    14    /* 円形弾の速い弾の速度 */
  37.  
  38. #define SPEED_SHOT3_1    8
  39. #define SPEED_SHOT3_2    17
  40.  
  41. #define SEQ_DEATH    3
  42.  
  43.  
  44. static signed short shot_pos[32][2] =
  45. {
  46.     {0, 24},
  47.     {4, 23},
  48.     {9, 22},
  49.     {13, 19},
  50.     {16, 16},
  51.     {19, 13},
  52.     {22, 9},
  53.     {23, 4},
  54.     {24, 0},
  55.     {23, -4},
  56.     {22, -9},
  57.     {19, -13},
  58.     {16, -16},
  59.     {13, -19},
  60.     {9, -22},
  61.     {4, -23},
  62.     {0, -24},
  63.     {-4, -23},
  64.     {-9, -22},
  65.     {-13, -19},
  66.     {-16, -16},
  67.     {-19, -13},
  68.     {-22, -9},
  69.     {-23, -4},
  70.     {-24, 0},
  71.     {-23, 4},
  72.     {-22, 9},
  73.     {-19, 13},
  74.     {-16, 16},
  75.     {-13, 19},
  76.     {-9, 22},
  77.     {-4, 23},
  78. };
  79.  
  80. static short EnemyMoveLBoss03P (ENEMY *);
  81. static void EnemyTiniLBoss03P (ENEMY *);
  82.  
  83.  
  84. void EnemyInitLBoss03P (ENEMY * p)
  85. {
  86.     p->hit_px = 24;
  87.     p->hit_py = 16;
  88.     p->hit_sx = 24;
  89.     p->hit_sy = 16;
  90.     p->hit_cx = 6;
  91.     p->timer = 0;
  92.     p->damage = 0;
  93.     p->flash = 0;
  94.     p->seq = 0;
  95.     p->pt = obj_lboss03 + 8;
  96.     p->m_work = 0;
  97.     p->s_work = p->arg * 7;    /* ショットの周期をずらす */
  98.     p->s_work2 = 0;
  99.     p->func_enemy_move = EnemyMoveLBoss03P;
  100.     p->func_enemy_tini = EnemyTiniLBoss03P;
  101.  
  102.     if (p->arg < 4) {
  103.         /* 3面ボスとして登場時 */
  104.         signed short hp_table[4] =
  105.         {HP_0, HP_1, HP_2, HP_3};
  106.         p->work4 = PALET_LBOSS03 | PRIORITY_BOSS_PARTS_L;
  107.         p->hp = hp_table[p->arg];    /* 実はパーツによって耐久力が違う */
  108.     } else {
  109.         /* 4面ボスラッシュ時 */
  110.         signed short hp_table[4] =
  111.         {HP_4, HP_5, HP_6, HP_7};
  112.         p->arg -= 4;
  113.         p->work4 = PALET_LBOSS03_1 | PRIORITY_BOSS_PARTS_L;
  114.         p->hp = hp_table[p->arg];    /* 実はパーツによって耐久力が違う */
  115.     }
  116. }
  117.  
  118.  
  119.  
  120. static short EnemyMoveLBoss03P (ENEMY * p)
  121. {
  122.     short h;
  123.  
  124.     if ((p->child_kill) || (p->child_death))
  125.         return (-1);    /* 消去 */
  126.     p->timer++;
  127.     if (p->timer > TIMER_TIMEOUT) {
  128.         EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  129.         SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  130.         p->child_death = !0;    /* 消去準備 */
  131.     } {
  132.         unsigned char a;
  133.         /* コアが外側にある時の座標 */
  134.         signed short core_table1[33][2] =
  135.         {
  136.             {0, 45},
  137.             {8, 45},
  138.             {17, 42},
  139.             {25, 38},
  140.             {32, 32},
  141.             {38, 25},
  142.             {42, 17},
  143.             {45, 8},
  144.             {45, 0},
  145.             {45, -8},
  146.             {42, -17},
  147.             {38, -25},
  148.             {32, -32},
  149.             {25, -38},
  150.             {17, -42},
  151.             {8, -45},
  152.             {0, -45},
  153.             {-8, -45},
  154.             {-17, -42},
  155.             {-25, -38},
  156.             {-32, -32},
  157.             {-38, -25},
  158.             {-42, -17},
  159.             {-45, -8},
  160.             {-45, 0},
  161.             {-45, 8},
  162.             {-42, 17},
  163.             {-38, 25},
  164.             {-32, 32},
  165.             {-25, 38},
  166.             {-17, 42},
  167.             {-8, 45},
  168.             {0, 45},
  169.         };
  170.         /* 表示座標の処理 */
  171.         switch (p->arg) {
  172.         case 0:
  173.             a = p->parent->angle + 32 + 64 * 0;
  174.             a /= 8;
  175.             p->x = p->parent->x + core_table1[a][0];
  176.             p->y = p->parent->y - core_table1[a][1] - 8;
  177.             break;
  178.         case 1:
  179.             a = p->parent->angle + 32 + 64 * 1;
  180.             a /= 8;
  181.             p->x = p->parent->x + core_table1[a][0];
  182.             p->y = p->parent->y - core_table1[a][1] - 8;
  183.             break;
  184.         case 2:
  185.             a = p->parent->angle + 32 + 64 * 2;
  186.             a /= 8;
  187.             p->x = p->parent->x + core_table1[a][0];
  188.             p->y = p->parent->y - core_table1[a][1] - 8;
  189.             break;
  190.         case 3:
  191.             a = p->parent->angle + 32 + 64 * 3;
  192.             a /= 8;
  193.             p->x = p->parent->x + core_table1[a][0];
  194.             p->y = p->parent->y - core_table1[a][1] - 8;
  195.             break;
  196.         }
  197.         p->pt = obj_lboss03 + 8 + ((p->parent->angle & 0x38) >> 3);
  198.     }
  199.  
  200.  
  201.     /* 攻撃処理 */
  202.     switch (p->parent->s_work) {
  203.     case 0:        /* 扇状弾 */
  204.         p->s_work++;
  205.         switch (p->s_work) {
  206. #define ANGLE1    12
  207.             /* case の順番に注意 */
  208.         case 62:
  209.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  210.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, p->s_angle - ANGLE1 * 3, 2);
  211.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, p->s_angle - ANGLE1 * 1, 2);
  212.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, p->s_angle + ANGLE1 * 1, 2);
  213.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, p->s_angle + ANGLE1 * 3, 2);
  214.             /* ここに break がない事に注意 */
  215.         case 2:
  216.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  217.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle - ANGLE1 * 3, 2);
  218.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle - ANGLE1 * 2, 2);
  219.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle - ANGLE1 * 1, 2);
  220.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle + ANGLE1 * 0, 2);
  221.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle + ANGLE1 * 1, 2);
  222.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle + ANGLE1 * 2, 2);
  223.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, p->s_angle + ANGLE1 * 3, 2);
  224.             SoundSetSE (SE_EBOMB_L);
  225.             break;
  226.         case 120:
  227.             p->s_work = 0;
  228.             break;
  229.         default:
  230.             break;
  231.         }
  232.         break;
  233.  
  234.     case 1:        /* かま状弾 */
  235.         p->s_work++;
  236.         switch (p->s_work) {
  237. #define INTERVAL2    3
  238.             /* case の順番に注意 */
  239.         case 2 + INTERVAL2 * 0:
  240.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  241.             p->s_work2 = SPEED_SHOT1_1;
  242.         case 2 + INTERVAL2 * 1:
  243.         case 2 + INTERVAL2 * 2:
  244.         case 2 + INTERVAL2 * 3:
  245.         case 2 + INTERVAL2 * 4:
  246.         case 2 + INTERVAL2 * 5:
  247.         case 2 + INTERVAL2 * 6:
  248.         case 2 + INTERVAL2 * 7:
  249.         case 2 + INTERVAL2 * 8:
  250.         case 2 + INTERVAL2 * 9:
  251.         case 2 + INTERVAL2 * 10:
  252.             EshotInit (ESHOT_NRG03, p->x, p->y, p->s_work2, p->s_angle, 2);
  253.             SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  254.             p->s_work2 += 1;
  255.             break;
  256.         case 80:
  257.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  258.             EshotInit (ESHOT_NRG24N, p->x, p->y, SPEED_SHOT1_2 + 4 * 0, p->s_angle, 2);
  259.             EshotInit (ESHOT_NRG24N, p->x, p->y, SPEED_SHOT1_2 + 4 * 1, p->s_angle, 2);
  260.             //EshotInit (ESHOT_NRG24N, p->x, p->y, SPEED_SHOT1_2 + 4 * 2, p->s_angle, 2);
  261.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  262.             break;
  263.         case 120:
  264.             p->s_work = 0;
  265.             break;
  266.         default:
  267.             break;
  268.         }
  269.         break;
  270.  
  271.  
  272.     case 2:        /* 円形弾 */
  273.         p->s_work++;
  274.         switch (p->s_work) {
  275.             /* case の順番に注意 */
  276.         case 20:
  277.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  278.             for (h = 0; h < 32; h += 4)
  279.                 EshotInit (ESHOT_NRG02, p->x + shot_pos[h][0], p->y + shot_pos[h][1],
  280.                        SPEED_SHOT2_1, p->s_angle, 2);
  281.             SoundSetSE (SE_EBOMB_M);
  282.             break;
  283.         case 50:
  284.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  285.             for (h = 0; h < 32; h += 4)
  286.                 EshotInit (ESHOT_NRG02, p->x + shot_pos[h][0], p->y + shot_pos[h][1],
  287.                        SPEED_SHOT2_2, p->s_angle + 16, 2);
  288.             SoundSetSE (SE_EBOMB_M);
  289.             break;
  290.         case 80:
  291.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  292.             for (h = 0; h < 32; h += 4)
  293.                 EshotInit (ESHOT_NRG02, p->x + shot_pos[h][0], p->y + shot_pos[h][1],
  294.                        SPEED_SHOT2_1, p->s_angle - 16, 2);
  295.             SoundSetSE (SE_EBOMB_M);
  296.             break;
  297.         case 150:
  298.             for (h = 0; h < 32; h += 4)
  299.                 EshotInit (ESHOT_NRG02, p->x + shot_pos[h][0], p->y + shot_pos[h][1],
  300.                        SPEED_SHOT2_2, 64, 2);
  301.             SoundSetSE (SE_EBOMB_M);
  302.             break;
  303.         case 180:
  304.             for (h = 0; h < 32; h += 4)
  305.                 EshotInit (ESHOT_NRG02, p->x + shot_pos[h][0], p->y + shot_pos[h][1],
  306.                        SPEED_SHOT2_2, 64 + 16, 2);
  307.             SoundSetSE (SE_EBOMB_M);
  308.             break;
  309.         case 210:
  310.             for (h = 0; h < 32; h += 4)
  311.                 EshotInit (ESHOT_NRG02, p->x + shot_pos[h][0], p->y + shot_pos[h][1],
  312.                        SPEED_SHOT2_2, 64 - 16, 2);
  313.             SoundSetSE (SE_EBOMB_M);
  314.             break;
  315.         case 240:
  316.             p->s_work = 0;
  317.             break;
  318.         default:
  319.             break;
  320.         }
  321.         break;
  322.  
  323.     case 3:        /* 炸裂弾 */
  324.         p->s_work++;
  325.         switch (p->s_work) {
  326.             /* case の順番に注意 */
  327.         case 20:
  328.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  329.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT3_1 + 2 * 0, p->s_angle, 2);
  330.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT3_1 + 2 * 1, p->s_angle, 2);
  331.             EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT3_1 + 2 * 2, p->s_angle, 2);
  332.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 3, p->s_angle, 2);
  333.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 4, p->s_angle, 2);
  334.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 5, p->s_angle, 2);
  335.             EshotInit (ESHOT_NRG06, p->x, p->y, SPEED_SHOT3_1 + 2 * 6, p->s_angle, 2);
  336.             EshotInit (ESHOT_NRG35, p->x, p->y, SPEED_SHOT3_1 + 2 * 7, p->s_angle, 2);
  337.             EshotInit (ESHOT_NRG35, p->x, p->y, SPEED_SHOT3_1 + 2 * 8, p->s_angle, 2);
  338.             EshotInit (ESHOT_NRG35, p->x, p->y, SPEED_SHOT3_1 + 2 * 9, p->s_angle, 2);
  339.             SoundSetSE (SE_EXLASER);
  340.             break;
  341.         case 50:
  342.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT3_1 + 2 * 0, p->s_angle + 32, 2);
  343.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT3_1 + 2 * 1, p->s_angle + 32, 2);
  344.             EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT3_1 + 2 * 2, p->s_angle + 32, 2);
  345.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 3, p->s_angle + 32, 2);
  346.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 4, p->s_angle + 32, 2);
  347.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 5, p->s_angle + 32, 2);
  348.             EshotInit (ESHOT_NRG06, p->x, p->y, SPEED_SHOT3_1 + 2 * 6, p->s_angle + 32, 2);
  349.             EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT3_1 + 2 * 7, p->s_angle + 32, 2);
  350.             EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT3_1 + 2 * 8, p->s_angle + 32, 2);
  351.             EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT3_1 + 2 * 9, p->s_angle + 32, 2);
  352.             SoundSetSE (SE_EXLASER);
  353.             break;
  354.         case 80:
  355.             EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT3_1 + 2 * 0, p->s_angle - 32, 2);
  356.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT3_1 + 2 * 1, p->s_angle - 32, 2);
  357.             EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT3_1 + 2 * 2, p->s_angle - 32, 2);
  358.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 3, p->s_angle - 32, 2);
  359.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 4, p->s_angle - 32, 2);
  360.             EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT3_1 + 2 * 5, p->s_angle - 32, 2);
  361.             EshotInit (ESHOT_NRG06, p->x, p->y, SPEED_SHOT3_1 + 2 * 6, p->s_angle - 32, 2);
  362.             EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT3_1 + 2 * 7, p->s_angle - 32, 2);
  363.             EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT3_1 + 2 * 8, p->s_angle - 32, 2);
  364.             EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT3_1 + 2 * 9, p->s_angle - 32, 2);
  365.             SoundSetSE (SE_EXLASER);
  366.             break;
  367.         case 120:
  368.             p->s_work = 0;
  369.             break;
  370.         default:
  371.             break;
  372.         }
  373.         break;
  374.  
  375.     default:
  376.         break;
  377.     }
  378.  
  379.  
  380.  
  381.     /* 自機ショットに当たった時の処理 */
  382.     if (p->damage) {
  383.         p->info = PALET_RED | PRIORITY_BOSS_PARTS_L;
  384.         p->damage_core = 0;
  385.         if ((p->hp -= p->damage) <= 0) {
  386.             /* 死んだ */
  387.             p->m_work = 0;
  388.             p->hit_px = p->hit_py = p->hit_sx = p->hit_sy = p->hit_cx = 0;
  389.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  390.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  391.             if (p->parent->core_info == (PALET_CORE_RED | PRIORITY_BOSS_CORE))
  392.                 EffectInit (EFFECT_POINTS_RED, POINTS_5000, p->x, p->y);
  393.             else
  394.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_3000, p->x, p->y);
  395.             if (disp_level == DISP_LEVEL_HIGH)
  396.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  397.             p->child_death = !0;    /* 消去準備 */
  398.         }
  399.         p->damage = 0;
  400.         p->flash = TIMER_FLASH_DAMAGE;
  401.     } else {
  402.         if (((p->flash++ > TIMER_FLASH_RED) && (p->hp < 100)) && (p->seq != SEQ_DEATH)) {
  403.             p->info = PALET_RED | PRIORITY_BOSS_PARTS_L;
  404.             if (p->flash > TIMER_FLASH_NORMAL)
  405.                 p->flash = 0;
  406.         } else {
  407.             p->info = p->work4;
  408.         }
  409.     }
  410.  
  411.     xobj_set_st (p);
  412.  
  413.     return (0);
  414. }
  415.  
  416.  
  417.  
  418. static void EnemyTiniLBoss03P (ENEMY * p)
  419. {
  420. }
  421.